circuit MAC :
  module MAC :
    input clock : Clock
    input reset : UInt<1>
    input io_macIO_dataIn : SInt<8>
    input io_macIO_accIn : SInt<32>
    input io_macIO_swichw : UInt<1>
    input io_macIO_weightIn : SInt<8>
    input io_macIO_weightWe : UInt<1>
    input io_macIO_weightTag : UInt<8>
    output io_macIO_outDelay : SInt<32>
    output io_macIO_dataDelay : SInt<8>
    output io_macIO_switchDelay : UInt<1>
    output io_macIO_weightDelay : SInt<8>
    output io_macIO_weightWeDelay : UInt<1>
    output io_macIO_weightTagDelay : UInt<8>

    reg wbuf1 : SInt<8>, clock with :
      reset => (UInt<1>("h0"), wbuf1) @[MAC.scala 45:29]
    reg wbuf2 : SInt<8>, clock with :
      reset => (UInt<1>("h0"), wbuf2) @[MAC.scala 45:29]
    reg currentBufferReg : UInt<1>, clock with :
      reset => (UInt<1>("h0"), currentBufferReg) @[MAC.scala 46:33]
    node _currentBufferReg_T = not(currentBufferReg) @[MAC.scala 48:25]
    node _GEN_0 = mux(io_macIO_swichw, _currentBufferReg_T, currentBufferReg) @[MAC.scala 47:24 48:22 46:33]
    node currenBuffer = xor(currentBufferReg, io_macIO_swichw) @[MAC.scala 51:39]
    node _T = eq(io_macIO_weightTag, UInt<3>("h4")) @[MAC.scala 53:47]
    node _T_1 = and(io_macIO_weightWe, _T) @[MAC.scala 53:26]
    node _T_2 = eq(currenBuffer, UInt<1>("h0")) @[MAC.scala 54:22]
    node _GEN_1 = mux(_T_2, io_macIO_weightIn, wbuf2) @[MAC.scala 54:29 55:13 45:29]
    node _GEN_2 = mux(_T_2, wbuf1, io_macIO_weightIn) @[MAC.scala 45:29 54:29 57:13]
    node _GEN_3 = mux(_T_1, _GEN_1, wbuf2) @[MAC.scala 45:29 53:67]
    node _GEN_4 = mux(_T_1, _GEN_2, wbuf1) @[MAC.scala 45:29 53:67]
    node _weight_T = eq(currenBuffer, UInt<1>("h1")) @[MAC.scala 61:32]
    node weight = mux(_weight_T, wbuf2, wbuf1) @[MAC.scala 61:19]
    node product = mul(weight, io_macIO_dataIn) @[MAC.scala 62:24]
    node _out_T = add(product, io_macIO_accIn) @[MAC.scala 63:21]
    node _out_T_1 = tail(_out_T, 1) @[MAC.scala 63:21]
    node out = asSInt(_out_T_1) @[MAC.scala 63:21]
    reg io_macIO_dataDelay_REG : SInt<8>, clock with :
      reset => (UInt<1>("h0"), io_macIO_dataDelay_REG) @[MAC.scala 65:32]
    reg io_macIO_switchDelay_REG : UInt<1>, clock with :
      reset => (UInt<1>("h0"), io_macIO_switchDelay_REG) @[MAC.scala 66:34]
    reg io_macIO_outDelay_REG : SInt<32>, clock with :
      reset => (UInt<1>("h0"), io_macIO_outDelay_REG) @[MAC.scala 67:31]
    reg io_macIO_weightDelay_REG : SInt<8>, clock with :
      reset => (UInt<1>("h0"), io_macIO_weightDelay_REG) @[MAC.scala 68:34]
    reg io_macIO_weightWeDelay_REG : UInt<1>, clock with :
      reset => (UInt<1>("h0"), io_macIO_weightWeDelay_REG) @[MAC.scala 69:36]
    node _io_macIO_weightTagDelay_T = add(io_macIO_weightTag, UInt<1>("h1")) @[MAC.scala 70:58]
    node _io_macIO_weightTagDelay_T_1 = tail(_io_macIO_weightTagDelay_T, 1) @[MAC.scala 70:58]
    reg io_macIO_weightTagDelay_REG : UInt<8>, clock with :
      reset => (UInt<1>("h0"), io_macIO_weightTagDelay_REG) @[MAC.scala 70:37]
    io_macIO_outDelay <= io_macIO_outDelay_REG @[MAC.scala 67:21]
    io_macIO_dataDelay <= io_macIO_dataDelay_REG @[MAC.scala 65:22]
    io_macIO_switchDelay <= io_macIO_switchDelay_REG @[MAC.scala 66:24]
    io_macIO_weightDelay <= io_macIO_weightDelay_REG @[MAC.scala 68:24]
    io_macIO_weightWeDelay <= io_macIO_weightWeDelay_REG @[MAC.scala 69:26]
    io_macIO_weightTagDelay <= io_macIO_weightTagDelay_REG @[MAC.scala 70:27]
    wbuf1 <= mux(reset, asSInt(UInt<8>("h0")), _GEN_4) @[MAC.scala 45:{29,29}]
    wbuf2 <= mux(reset, asSInt(UInt<8>("h0")), _GEN_3) @[MAC.scala 45:{29,29}]
    currentBufferReg <= mux(reset, UInt<1>("h0"), _GEN_0) @[MAC.scala 46:{33,33}]
    io_macIO_dataDelay_REG <= mux(reset, asSInt(UInt<1>("h0")), io_macIO_dataIn) @[MAC.scala 65:{32,32,32}]
    io_macIO_switchDelay_REG <= mux(reset, UInt<1>("h0"), io_macIO_swichw) @[MAC.scala 66:{34,34,34}]
    io_macIO_outDelay_REG <= mux(reset, asSInt(UInt<1>("h0")), out) @[MAC.scala 67:{31,31,31}]
    io_macIO_weightDelay_REG <= mux(reset, asSInt(UInt<1>("h0")), io_macIO_weightIn) @[MAC.scala 68:{34,34,34}]
    io_macIO_weightWeDelay_REG <= mux(reset, UInt<1>("h0"), io_macIO_weightWe) @[MAC.scala 69:{36,36,36}]
    io_macIO_weightTagDelay_REG <= mux(reset, UInt<1>("h0"), _io_macIO_weightTagDelay_T_1) @[MAC.scala 70:{37,37,37}]
